
import CryptoJS from "crypto-js";

// 十六位十六进制数作为密钥
//const key = CryptoJS.enc.Utf8.parse("1234567890000000"); //16位
// 十六位十六进制数作为密钥偏移量
//const iv = CryptoJS.enc.Utf8.parse("1234567890000000");

const HEX_DIGITS = "0123456789ABCDEF"

/**
 * AES对称加密 （CBC模式，需要偏移量）
 * @param {Object} params 明文参数
 */
export function encrypt(params, strKey, strIv){
  const key = CryptoJS.enc.Utf8.parse(strKey);
  const iv = CryptoJS.enc.Utf8.parse(strIv);
  //明文参数
  let str = typeof params == "object" ? CryptoJS.enc.Utf8.parse(JSON.stringify(params)) : CryptoJS.enc.Utf8.parse(params);
  //加密
  let encryptedData = CryptoJS.AES.encrypt(str, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC, //AES加密模式
    padding: CryptoJS.pad.Pkcs7 //填充方式
  });
  // console.log("加密前："+params);//加密前：QWEASDZXC
  // console.log("加密后："+encryptedData);//加密后：vlgQpBdfVvMplxwOTjxSyQ==
  return CryptoJS.enc.Base64.stringify(encryptedData.ciphertext); //返回base64格式密文
}
  
/**
 * AES对称解密
 * @param {Object} params 加密参数
 */
export function decrypt(params, strKey, strIv){
  const key = CryptoJS.enc.Utf8.parse(strKey);
  const iv = CryptoJS.enc.Utf8.parse(strIv);
  //base64格式密文转换
  let base64 = CryptoJS.enc.Base64.parse(params);
  let str = CryptoJS.enc.Base64.stringify(base64);
  //解密
  let decryptedData = CryptoJS.AES.decrypt(str, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC, //AES加密模式
    padding: CryptoJS.pad.Pkcs7 //填充方式
  });
  // console.log("解密前："+params);//解密前：vlgQpBdfVvMplxwOTjxSyQ==
  // console.log("解密后："+CryptoJS.enc.Utf8.stringify(decryptedData).toString());//解密后：QWEASDZXC
  return CryptoJS.enc.Utf8.stringify(decryptedData).toString(); //返回明文
}


/**
 * 生成16位16进制字符串
 */
export function generateKey(){
  let key = ""
  for(let i=0; i<16; i++){
    key += HEX_DIGITS[Math.floor(Math.random() * 16)];
  }
  return key
}